#include "MyList.h"

//1. initList(&L)：初始化表。构造一个空的线性表。放回值应该是一个线性表
myList* initList() {
    myList* list = (myList*)malloc(sizeof(myList));
    list->maxSize = 20;
    list->size = 0;

    list->pAddr = (int*)malloc(sizeof(int) * list->maxSize);
    return list;
}

//2. destroyList(&L)：销毁操作。销毁线性表，并释放线性表L所占的内存空间。放回值为void
int destroyList(myList* list) {
    if(list == NULL) return 0;
    //释放指向的内存区域
    if(list->pAddr != NULL) {
        free(list->pAddr);
        list->pAddr = NULL;
    }
    //释放线性表
    free(list);
    list = NULL;
    return 1;
}

//3. locateElem(L,e)：按值查找操作。在表中L查找具有给定关键值的元素。放回一个int类型
int locateElem(myList* list,int value) {
    for(int i = 0;i < list->size;i++) {
        if(list->pAddr[i] == value) return i+1;
    }
    return 0;
}

//4. getElem(L,i)：按位查找。获取表中第i个位置的元素的值。
int getElem(myList* list, int pos) {
    if(pos < 1 || pos > list->size) return 0;
    return list->pAddr[pos - 1];
}

//5. listInsert(&L,i,e)：插入操作。在表L中的第i个位置上插入指定的元素e。
int listInsert(myList* list, int pos,int value) {   //插入成功放回1，否则放回0
    //如果插入的元素的位置比1小或者大于顺序表的长度 + 1，则插入失败，放回0
    if(pos < 1 || pos > list->size + 1) return 0;
    //判断该顺序表的空间是否满，满了则需要扩容
    if(list->size >= list->maxSize) {
        //扩容
        //第一步：申请一块更大的内存空间 新空间是旧空间的两倍
        int* newSpace = (int*)malloc(sizeof(int) * list->maxSize * 2);
        //第二步：拷贝数据到新的空间
        memcpy(newSpace,list->pAddr,list->maxSize * sizeof(int));
        //第三步：释放旧空间的内存
        free(list->pAddr);
        //更新容量
        list->maxSize = list->maxSize * 2;
        //更新指针指向
        list->pAddr = newSpace;
    }

    //执行插入操作
    for(int i = list->size;i >= pos;i--) {
        list->pAddr[i] = list->pAddr[i -1];
    }

    list->pAddr[pos -1] = value;
    list->size++;
    return 1;
}

//6. listDelete(&L,i,e)：删除操作。删除表L中第i个位置的元素，并用e放回删除元素的值。
int listDelete(myList* list,int pos) {
    if(pos < 1 || pos > list->size) return 0;
    int temp = list->pAddr[pos -1];
    for(int i = pos -1;i < list->size - 1;i++) {
        list->pAddr[i] = list->pAddr[i + 1];
    }
    list->size--;
    return temp;
}

//7. PrintList(L)：输出操作。按前后顺序输出线性表L的所有元素值。
void PrintList(myList* list) {
    for(int i = 0;i < list->size;i++) {
        printf("%d ",list->pAddr[i]);
    }
    printf("\n");
}

//8. empty(L)：判空操作。若L为空表，则放回true，否则放回false。
int isEmpty(myList* list) {
    if(list == NULL || list->pAddr == NULL) return 1;
    return 0;
}

//9. length(L)：求表长。放回线性表L的长度，即L中数据元素的个数。
int getLength(myList* list) {
    return list->size;
}
